﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

//内存的概念和指针的概念
//内存是计算机中用来存储数据和程序的硬件设备
//内存是由很多内存区域组成的
//每个的变量都存贮在对应的内存区域中
//而每个内存区域都有一个或数个内存单元组成
//一个内存单元的大小是1个字节8位(8比特大小)
//每个内存单元都有一个唯一的地址(编号)内存地址也称为指针
//方便计算机访问内存中的数据
//内存单元的编号==地址==指针
// 
// 
//给变量取地址时是取内存单元地址为最小的地址
// (创建int类型的变量是向内存
// 申请了连续4个的内存单元 
// 那么有4个内存地址 而变量的地址取的是 
// 地址为最小的内存单元的地址作为变量的地址)
//


//指针 - 地址
//指针变量 - 存放地址的变量(本质是变量只不过是放了地址)

//int * p = &a;
//分开理解
//p是一个变量的名称
//*表示p是一个指针变量
//int在说明p指向的对象是int类型(int表示p指向的内存单元中存放的数据类型是int类型的数据)
//合起来理解
//p是变量(它跟int a 一样也向内存申请了空间 用来存放地址的值 不过是一个空间叫a另一个空间叫p)
//是int*是一个类型  专门存放int类型，数据的指针变量 
//
// 指针变量的类型有
// //short* - 专门存放short类型数据的指针变量类型
// //char* - 专门存放char类型数据的指针变量类型
// //int* - 专门存放int类型数据的指针变量类型
// //float* - 专门存放float类型数据的指针变量类型
// //double* - 专门存放double类型数据的指针变量类型
////指针变量的⼤⼩和类型是无关的，只要指针类型的变量，在相同的平台下，⼤⼩都是相同的。
// 
//指针变量也是变量，这种变量就是用来存放地址的，存放在指针变量中的值都会理解为地址

//in t main()
//{
//	int a = 10;
//	//&a --- &取地址运算符 取变量a的地址
//	//&单目操作符
//	//printf("%p\n", &a);//%p 专门用来输出地址的占位符
//	//int* p = &a;//p是一个变量(指针变量)，是一个空间
//	
//	return 0;
//}



//int main()
//{ 
//	int a = 10;
//	int* p = &a;
//	*p = 0;//* - 解引用操作符(间接访问操作符)			(* 是解引用操作符 通过指针变量p访问它指向的内存单元中的数据)
//	//此时*p就是变量a
//	printf("%d",a);//打印 a = 0
//
//	return 0;
//	//冷知识//*&a = 0;//等价于 a = 0;//取a的地址再解用(*与&在一定意义上是可以相互抵消但强烈不推荐怎么写属于脱裤子放屁 垃圾代码)
//	
//}

int main()
{
	printf("%zd\n",sizeof(char*));
	printf("%zd\n", sizeof(short*));
	printf("%zd\n", sizeof(int*));
	printf("%zd\n", sizeof(float*));
	printf("%zd\n", sizeof(double*));

}

//32位机器假设有32根地址总线，每根地址线出来的电信号转换成数字信号后是1或者0，那我们把32根地址线产⽣的2进制序列当做⼀个地址，那么⼀个地址就是32个bit位，需要4 个字节才能存储
//地址的大小是由计算机决定的在32位计算机中地址是32位(比特)4个字节同理在64位计算机中地址是64位8个字节
//结论
//32位平台下地址是32个bit位，指针变量⼤⼩是4个字节。 
//64位平台下地址是64个bit位，指针变量⼤⼩是8个字节。
//注意指针变量的⼤⼩和类型是无关的，只要指针类型的变量，在相同的平台下，⼤⼩都是相同的。





